package impl;

import anaydis.sort.SorterType;
import org.jetbrains.annotations.NotNull;
import java.util.Comparator;
import java.util.List;

public class MergeSorterTopDown extends AbstractSorter{  //TODO

    public MergeSorterTopDown(){
        super(SorterType.MERGE);
    }

    public <T> void sort(Comparator<T> tComparator, List<T> ts) {
        int subFiles = ts.size()/2;
        if(ts.size()%2 != 0){
            subFiles--;
        }
        for(int i = 0; i<ts.size()-1+1;i++){
        }
    }

    private <T> void merge(Comparator<T> tComparator, List<T> ts, int desde, int hasta, int quiebre){

        int g = desde;
        int h = quiebre;
        int i = 0;
        Object[] aux = new Object[hasta - g];

        //este while compara y agrega al arreglo auxiliar los datos ordenados
        while((g<quiebre) && (h<hasta)){
            if(greater(tComparator, ts, g, h)){
                aux[i] = ts.get(h);
                copy(h, i, true);
                h++;
            }
            else{
                aux[i] = ts.get(g);
                copy(g, i, true);
                g++;
            }
            i++;
        }

        //estos dos while agregan los datos que sobran al aux
        while(g<quiebre){
            aux[i] = ts.get(g);
            copy(g, i, true);
            g++;
            i++;
        }

        while(h<hasta){
            aux[i] = ts.get(h);
            copy(h, i, true);
            h++;
            i++;
        }

        for(int j = 0; j<aux.length;j++){
            ts.set(j+desde, (T)aux[j]);
            copy(j, j+desde, false);
        }
//chequeador de funcionamiento paso a paso
/*
        for(int o = 0; o<ts.size(); o++){
            System.out.print(ts.get(o)+" ");

        }
        System.out.println();
*/
    }

    @NotNull
    public SorterType getType() {
        return SorterType.MERGE;
    }
}
